訓練過程中可能會有關於圖片的錯誤訊息出現,不過並不是所有圖片都有問題,小部分的錯誤可以忽略。
如果出現的是缺少PIL的話,請安裝套件。
pip install pillow
如果出現的錯誤是OOM的話,代表你的視訊記憶體容量不足以滿足目前的設定,請適度調低圖片輸入的尺寸,或是小批量梯度下降的批大小。
input_shape = (160, 160)
batch_size = 32
接著我們對於昨天訓練的模型挑選來做測試,這裡我使用其自動儲存的EfficientNetB0-40.h5,在驗證集的正確率到達95.16%,先寫一個函數,載入模型,對輸入圖片縮放、預處理再進行辨識,接著到Google上搜尋一些貓狗的圖片,丟進模型看是否辨識成功。
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.keras.models import load_model
model = load_model('EfficientNetB0-40.h5')
input_shape = model.input_shape[1:3]
def predict(path, thresh=0.5):
img = load_img(path, target_size=input_shape, interpolation='lanczos')
img = img_to_array(img) / 255.
conf = model.predict(img.reshape(-1, *img.shape))[0][0]
animal = 'Cat' if conf < thresh else 'Dog'
return (animal, conf)
越靠近0、1代表模型越有信心,越靠近0.5代表越沒有信心,我抓了四張圖片,來看看結果如何。
>>> predict(r'cat1.jpg')
('Cat', 0.44871056)
>>> predict(r'cat2.jpg')
('Cat', 0.15131222)
>>> predict(r'dog1.jpg')
('Dog', 0.7994051)
>>> predict(r'dog2.jpg')
('Dog', 0.99938977)
如果你對這個模型滿意,想要保留之後使用的話,可以這樣設定儲存參數,那麼優化器的狀態不會被保存下來,可以節省不少體積,減少的體積量依使用優化器的不同而定,使用adam的話,這麼做是很有感的,如果你是之前中斷訓練,且有意後續載入繼續進行訓練的話,建議可以先不做。
model.save('EfficientNetB0-40-Stripped.h5', include_optimizer=False)